/**
 * 函数默认具有外部链接
 * 
 * 具有外部链接的全局变量
 *   具有外部链接的全局变量有时称为外部变量。
 *   要使全局变量成为外部变量（从而可以被其他文件访问），我们可以使用关键字extern来执行此操作
 * 
 * 通过 extern 关键字进行变量前向声明
 *   要实际使用已在另一个文件中定义的外部全局变量，您还必须forward declaration在希望使用该变量的任何其他文件中放置该全局变量。
 *   对于变量，创建前向声明也是通过extern关键字完成的（没有初始化值）。
 * 
 * 注意
 *   1.
 *   extern关键字在不同的上下文中具有不同的含义。
 *   在某些情况下，extern意味着“给这个变量提供外部链接”。在其他上下文中，extern意味着“这是在其他地方定义的外部变量的前向声明”。
 *   2.
 *   如果你想定义一个未初始化的非常量全局变量，不要使用 extern 关键字，否则 C++ 会认为你试图为该变量进行前向声明。
 *   3.
 *   虽然 constexpr 变量可以通过关键字进行外部链接extern，但它们不能向前声明为 constexpr。这是因为编译器需要知道 constexpr 变量的值（在编译时）。如果该值是在其他文件中定义的，则编译器无法了解该其他文件中定义的值。
 *   但是，您可以将 constexpr 变量向前声明为 const，编译器会将其视为运行时 const。这并不是特别有用。
 * 
 */

#include <iostream>

void sayHi(); // forward declaration for function sayHi, makes sayHi accessible in this file

extern int g_x; // this extern is a forward declaration of a variable named g_x that is defined somewhere else
extern const int g_y; // this extern is a forward declaration of a const variable named g_y that is defined somewhere else
// extern constexpr int g_z; // not allowed: constexpr variables can't be forward declared
extern const int g_z;

int main() {
    sayHi(); // call to function defined in another file, linker will connect this call to the function definition

    std::cout << g_x << ' ' << g_y << ' ' << g_z << '\n'; // prints 2 3 5
}